class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        // 丢失的数字 + 只出现一次的数字Ⅲ(一个数出现一次，其他数出现2次)的结合体
        // 先把所有的数异或在一起
        int ret = 0, n = nums.size();
        for(int i = 0; i < n; i++)
            ret ^= nums[i];
        for(int i = 1; i <= n + 2; i++)
            ret ^= i;

        // 提取异或结果中为1的那一位，进行后续分组
        unsigned int lowbit = ret & (-ret);

        // 分组
        vector<int> ans(2);
        for(auto &x : nums)
            ans[((x & lowbit) != 0)] ^= x;
        for(int i = 1; i <= n + 2; i++)
            ans[((i & lowbit) != 0)] ^= i;
        return ans;
    }
};